﻿namespace Digitalmes.Application.Sys.Menus;

/// <summary>
/// 菜单 DTO 对象。
/// </summary>
public sealed class SysMenuDto : Dto
{
    /// <summary>
    /// 父 Id
    /// </summary>
    public long ParentId { get; set; }

    /// <summary>
    /// 菜单类型（0->菜单、1->iframe、2->外链、3->按钮）
    /// </summary>
    public MenuTypeEnum MenuType { get; set; }

    /// <summary>
    /// 菜单名称
    /// </summary>
    [NotNull]
    public string? Title { get; set; }

    /// <summary>
    /// 路由名称
    /// </summary>
    /// <remarks>必须唯一并且和当前路由component字段对应的页面里用defineOptions包起来的name保持一致。</remarks>
    [NotNull]
    public string? Name { get; set; }

    /// <summary>
    /// 路由路径
    /// </summary>
    [NotNull]
    public string? Path { get; set; }

    /// <summary>
    /// 组件路径
    /// </summary>
    /// <remarks>传component组件路径，那么path可以随便写，如果不传，component组件路径会跟path保持一致。</remarks>
    public string? Component { get; set; }

    /// <summary>
    /// 排序
    /// </summary>
    /// <remarks>平台规定只有 home 路由的 rank 才能为 0。</remarks>
    public int Rank { get; set; }

    /// <summary>
    /// 路由重定向
    /// </summary>
    public string? Redirect { get; set; }

    /// <summary>
    /// 菜单图标
    /// </summary>
    public string? Icon { get; set; }

    /// <summary>
    /// 右侧图标
    /// </summary>
    public string? ExtraIcon { get; set; }

    /// <summary>
    /// 进场动画
    /// </summary>
    public string? EnterTransition { get; set; }

    /// <summary>
    /// 离场动画
    /// </summary>
    public string? LeaveTransition { get; set; }

    /// <summary>
    /// 菜单激活
    /// </summary>
    /// <remarks>
    /// 将某个菜单激活，主要用于通过query或params传参的路由，当它们通过配置showLink: false后不在菜单中显示，就不会有任何菜单高亮，
    /// 而通过设置activePath指定激活菜单即可获得高亮，activePath为指定激活菜单的path。
    /// </remarks>
    public string? ActivePath { get; set; }

    /// <summary>
    /// 权限标识（按钮级别权限设置）
    /// </summary>
    public string? Auths { get; set; }

    /// <summary>
    /// 链接地址（需要内嵌的iframe链接地址）
    /// </summary>
    public string? FrameSrc { get; set; }

    /// <summary>
    /// 加载动画（内嵌的iframe页面是否开启首次加载动画）
    /// </summary>
    public bool FrameLoading { get; set; }

    /// <summary>
    /// 是否缓存
    /// </summary>
    /// <remarks>是否缓存该路由页面，开启后会保存该页面的整体状态，刷新后会清空状态。</remarks>
    public bool KeepAlive { get; set; }

    /// <summary>
    /// 是否隐藏标签页（当前菜单名称或自定义信息禁止添加到标签页）。
    /// </summary>
    public bool HiddenTag { get; set; }

    /// <summary>
    /// 是否固定标签页（当前菜单名称是否固定显示在标签页且不可关闭）
    /// </summary>
    public bool FixedTag { get; set; }

    /// <summary>
    /// 是否显示该菜单
    /// </summary>
    public bool ShowLink { get; set; }

    /// <summary>
    /// 是否显示父级菜单
    /// </summary>
    public bool ShowParent { get; set; }
}
